package com.lsy.poi;

import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.lsy.poi.bean.Index;
import com.lsy.poi.cell.CellParser;
import com.lsy.poi.cell.extractor.CeilingCellExtractor;
import com.lsy.poi.cell.extractor.DateCellExtractor;
import com.lsy.poi.row.RowMapper;
import com.lsy.poi.row.RowParser;
import com.lsy.poi.row.indexer.BlankSkippingRowIndexer;
import com.lsy.poi.row.validator.CellSizeValidator;
import com.lsy.poi.row.validator.RowValidator;
import com.lsy.poi.row.validator.UniqueValidator;
import com.lsy.poi.sheet.SheetParser;
import com.lsy.poi.sheet.validator.SheetValidator;

public class Test1 {

	public static void main1(String[] args) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		String sss = new String("aaa");
		System.out.println(sss);
		System.out.println(sss.length());
		
		
		/**
		 * 测试结论：使用 BeanUtils、PropertyUtils 无法为 String(基本类型) 进行 "值的更改"
		 */
//		BeanUtils.setProperty(sss, "valusse[]", new char[]{'b', 'b'});
//		PropertyUtils.setSimpleProperty(sss, "values", new char[]{'b', 'b', 'b'});
		
//		System.out.println(sss);
//		System.out.println(sss.length());
		
//		System.out.println(BeanUtils.getProperty(sss, "value[]"));
//		System.out.println(BeanUtils.getProperty(sss, "value123[]"));
//		System.out.println(BeanUtils.getProperty(sss, "value"));
//		System.out.println(PropertyUtils.getProperty(sss, "hash"));
		
		PropertyUtils.copyProperties(sss, "zxc4");
		
		System.out.println(sss);
		System.out.println(sss.length());
		
	}
	
	
	public static void main(String[] args) throws Exception {
		
		
		
		File file = new File("bbb.xlsx");
		System.out.println(file.getAbsolutePath());
		
		
		FileInputStream fis = new FileInputStream(file);
		XSSFWorkbook xwb = new XSSFWorkbook(fis);
		
		//TODO：xwb.getSheet("asd").getLastRowNum();
		//TODO：xwb.getSheetIndex("zxc");
		
		
		List<Student> sss = new ArrayList<Student>();
		List<String> sss2 = new ArrayList<String>();
		
		
		List<Student> sss01 = new ArrayList<Student>();
		List<Student> sss02 = new ArrayList<Student>();
		Index indexZXC = new Index(1);
		
		//所有的 index，都是 左闭右闭 的
		SheetParser[] sheetParsers = new SheetParser[] {
//				new SheetParser(new String[]{"Sheet4"/*, "Sheet2"*/},
//					new RowParser[] {
//						//如何 判断 RowParser 元素之间，beginIndex、endIndex 之间有 交错？
//						new RowParser(0, 0, 
//								RowParser.constructHeaderParsers(new String[]{"AAA", "BBB", "CCC", "DDD"})
//						),
//						new RowParser(1, 8, //TODO: 当 rowIndex 超出 实际时，会报错，但是 报错信息 不准确
//								new CellParser[] {
//									new CellParser(0, 1),
//									new CellParser(2, 2, new DateCellExtractor()),
//									new CellParser(3, 3),
//								},
//								/** 宗旨：rowMapper 要和  CellSizeValidator 对应 ，这要 开发者 自己 协调好
//								 *  1、PluggableFileParser 只负责 收集所有存在的 单元格
//								 *  2、至于 每个 row 的单元格 个数 是否正确 ；是否将 该 row map 到 javaBean，这都需要 开发者 在 rowMapper 中自己决定
//								 */
//								new RowValidator[]{
//									new CellSizeValidator(4),
//									new UniqueValidator(new HashMap<String, String>(), new int[]{1, 3}, new String[]{"A字段", "B字段"})
//								},
//								sss,
//								new RowMapper<Student>(new String[]{"name" , "address", "birthDay"}, Student.class)
//								//TODO: 如果是 String、基本类型，则 可以不用定义 propertyNames，并在 RowParser 173 行 直接复制，不需要使用 BeanUtils.setProperty
//								
//						),
//					}
//				),
				new SheetParser(new String[]{"Sheet5"/*, "Sheet2"*/},
						new RowParser[] {
//							//如何 判断 RowParser 元素之间，beginIndex、endIndex 之间有 交错？
//							new RowParser(0, 0, 
//									RowParser.constructHeaderParsers(new String[]{"AAA", "BBB", "CCC", "DDD"})
//							),
							new RowParser(new BlankSkippingRowIndexer(indexZXC), //TODO: 当 rowIndex 超出 实际时，会报错，但是 报错信息 不准确
									new CellParser[] {
										new CellParser(0, 1),
										new CellParser(2, 2, new DateCellExtractor()),
										new CellParser(3, 3),
									},
									/** 宗旨：rowMapper 要和  CellSizeValidator 对应 ，这要 开发者 自己 协调好
									 *  1、PluggableFileParser 只负责 收集所有存在的 单元格
									 *  2、至于 每个 row 的单元格 个数 是否正确 ；是否将 该 row map 到 javaBean，这都需要 开发者 在 rowMapper 中自己决定
									 */
									new RowValidator[]{
										new CellSizeValidator(4),
										new UniqueValidator(new HashMap<String, String>(), new int[]{1, 3}, new String[]{"A字段", "B字段"})
									},
									sss01,
									new RowMapper<Student>(new String[]{"name" , "address", "birthDay"}, Student.class)
									//TODO: 如果是 String、基本类型，则 可以不用定义 propertyNames，并在 RowParser 173 行 直接复制，不需要使用 BeanUtils.setProperty
									
							),
							
							new RowParser(new BlankSkippingRowIndexer(indexZXC), //TODO: 当 rowIndex 超出 实际时，会报错，但是 报错信息 不准确
									new CellParser[] {
										new CellParser(0, 1),
										new CellParser(2, 2, new DateCellExtractor()),
										new CellParser(3, 3),
									},
									/** 宗旨：rowMapper 要和  CellSizeValidator 对应 ，这要 开发者 自己 协调好
									 *  1、PluggableFileParser 只负责 收集所有存在的 单元格
									 *  2、至于 每个 row 的单元格 个数 是否正确 ；是否将 该 row map 到 javaBean，这都需要 开发者 在 rowMapper 中自己决定
									 */
									new RowValidator[]{
										new CellSizeValidator(4),
										new UniqueValidator(new HashMap<String, String>(), new int[]{1, 3}, new String[]{"A字段", "B字段"})
									},
									sss02,
									new RowMapper<Student>(new String[]{"name" , "address", "birthDay"}, Student.class)
									//TODO: 如果是 String、基本类型，则 可以不用定义 propertyNames，并在 RowParser 173 行 直接复制，不需要使用 BeanUtils.setProperty
									
							),
						}
				),
//				new SheetParser(new String[]{"Sheet3"},
//						new RowParser[] {
//							//如何 判断 RowParser 元素之间，beginIndex、endIndex 之间有 交错？
//							new RowParser(0, 0, 
//									RowParser.constructHeaderParsers(new String[]{"AB111C", "AAA", "BBB", "CCC", "DDD"})
//							),
//							new RowParser(1, 100, //TODO: 当 rowIndex 超出 实际时，会报错，但是 报错信息 不准确
//									new CellParser[] {
//										new CellParser(0, new CeilingCellExtractor()),
//										new CellParser(1, 2),
//										new CellParser(3, 3, new DateCellExtractor()),
//										new CellParser(4, 4),
//									},
//									new RowValidator[]{
//										new UniqueValidator(new HashMap<String, String>(), new int[]{2, 4}, new String[]{"A字段", "B字段"})
//									},
//									sss,
//									new RowMapper<Student>(new String[]{"batch", "name" , "address", "birthDay"}, Student.class)
//									//TODO: 如果是 String、基本类型，则 可以不用定义 propertyNames，并在 RowParser 173 行 直接复制，不需要使用 BeanUtils.setProperty
//									
//							),
//						}
//					),
		};
		
		
		List<String> errors = new ArrayList<String>();
		
		new PluggableFileParser(xwb, sheetParsers, errors).parse();
		
		
		System.out.println("=====> 错误个数：" + errors.size());
		for (String error : errors) {
			System.out.println(error);
		}
		System.out.println("====================>>>>>");
		for (Student student : sss) {
			System.out.println(student);
		}
		System.out.println("====================>>>>>");
		for (Student student : sss01) {
			System.out.println(student);
		}
		System.out.println("====================>>>>>");
		for (Student student : sss02) {
			System.out.println(student);
		}
//		System.out.println("====================>>>>>");
//		for (String string : sss2) {
//			System.out.println(string);
//		}
		
//		
//		for (CellParser cellParser : cellParsers) {
//			cellParser.setCell(row.getCell(cellParser.getIndex()));
//			cellParser.parse();
//		}
		
		
//		for (CellParser cellParser2 : cellParser) {
//			
//		}
//		for (CellParser myCell : myCells) {
//			myCell.setCell(row.getCell(myCell.getIndex()));
//			myCell.parse();
//		}
		
//		myCell.setCell(row.getCell(myCell.getIndex()));
//		
//		myCell.parse();
		
		
		/**
		 * 检验文件名、后缀名
		 * ---------------------------------  error 返回点
		 * 	
		 * 	==> 第 0 页
		 *  	第 0 行（表头检查）
		 *  		第 0 列：提取器、验证器 //设计 cellValidator，里面包含默认的  提取器：按 String 提取，验证器：字符串比对 （）
		 * 			第 1 列：提取器、验证器
		 * 			第 2 列：提取器、验证器
		 * 		第 1-9 行  
		 * 			第 0 列：提取器、验证器
		 * 			第 1 列：提取器、验证器
		 * 			第 2 列：提取器、验证器
		 * ---------------------------------  error 返回点
		 *  	整体验证器1、整体验证器2  
		 * ---------------------------------  error 返回点
		 * 	
		 * 	==> 第 1 页
		 *  	第 0 行（表头检查）
		 *  		第 0 列：提取器、验证器
		 * 			第 1 列：提取器、验证器
		 * 			第 2 列：提取器、验证器
		 * 		第 1-9 行  
		 * 			第 0 列：提取器、验证器
		 * 			第 1 列：提取器、验证器
		 * 			第 2 列：提取器、验证器
		 * ---------------------------------  error 返回点
		 *  	整体验证器1、整体验证器2
		 *  
		 */
		
//		try {
//			xwb = new XSSFWorkbook(new FileInputStream(file));//poi 的jar包 同时会用到xmlbeans 的jar包，故要一同导入项目
//		} catch (Exception e1) {
//			return;
//		}
		
		
		
		
	}
}
